NocobaseからデータベースのViewに接続する
Nocobaseで運用しているアプリで所属や役割などの履歴を持ちつつ現在の状態を表示させることはできない?_その2
でSQLコレクションを使ってデータ表示を行いました。
データベースにViewを作るのではなく、Nocobase上で全ての操作ができるので簡潔にやりたいことを可能にしてくれました。
NocobaseではデータベースのViewに接続する方法も提供されています。
今回はこの方法でも試してみようと思います。
データベースでViewを作成
Nocobaseのアプリから接続するためのViewを作成します。
使用しているデータソース接続がMySQLなので、MySQLでViewを作成してみます。
Nocobaseアプリで接続している実テーブルから作っておきます。
例)
CREATE VIEW emp_departments AS
SELECT emp.employee_id, emp.name, dep.department, emp.hire_date,r.id as rel_id
FROM employees emp
LEFT JOIN r_employees_and_departments r as r.employee_id = emp.id
LEFT JOIN departments dep as dep.id = r.department_id
Viewへの接続作成
コレクションの管理画面からコレクションの作成時にVIewに接続を選択します。
このようにデータベースに作成したViewが選択肢として現れます。
フィールドの箇所にViewで定義した内容が表示されます。
Nocobaseでのフィールドタイプを設定するとプレビューが見れるようになります。
データソースのフィールタイプに合わせて設定しておきます。
ユニークキーを指定したいのですが、新規作成では候補のカラムが現れませんでした。不具合かもしれません。
一度保存して、フィールドの設定画面からユニークキーを設定しました。
ブロックで表示させるときのためのフィールド表示名の設定も行えます。
ブロック追加
ページのブロック追加から作成したViewを表示できるかみてみます。
このように先ほど作成したViewコレクションを選択できるようになっているはずです。
他のコレクションと同じようにViewの内容が表示されますね。
SQLコレクションと同じように、VIewコレクションでもデフォルトでは表示のみ可能です。
ただし、Viewコレクションではデータベースの仕様に沿った形でデータ編集ができます。
データ編集ができるView
コレクションの編集画面や作成画面で削除変更操作の許可
にチェックを入れると
このように編集や削除の操作メニューが現れるようになります。
ただしViewがデータ編集に対応していない形式だと
このように保存ボタンを押してもエラーとなりました。
MySQLで更新可能なViewの条件は、
更新可能および挿入可能なビュー に書かれている通りです。
- 単一テーブルからのみ選択されている
- 定数ではない列
- 集約関数を使用していない
- DISTINCT句がない
- サブクエリを含まない
といったものが挙げられていますね。
今回試したサンプルではJoinを使用していたので編集はできません。
create view sample_view_2 as select id, name, updatedAt from m_employees;
このようなViewだと編集は可能でした。
MySQLではビューに対してWITH CHECK OPTION
を追加すると、ビューの定義に適合しないデータの挿入や更新ができなくなります。
たとえば、営業部以外の従業員を追加できないようにするには次のようにします。
CREATE VIEW sales_employees AS
SELECT employee_id, name, department, salary, hire_date
FROM employees
WHERE department = '営業部'
WITH CHECK OPTION;
WHERE句がtrueでない行への挿入を防止できます。 また、WHERE句がtrueであるが、更新によってtrueにならない行の更新も防止されます
このようにデータベースによる強力な機能が必要な場合はSQLコレクションよりViewを接続して使ったほうが便利になる可能性がありますね。
PostgreSQLやOracle、SQL Serverでも単一テーブル、集約関数の不使用、サブクエリやJOINなしといった条件が共通しており、これらを満たすシンプルなビューは更新可能です。
INSTEAD OF トリガー
がサポートされるデータベースでは、これを使用することにより複雑なVIewでも更新可能になるようです。